#include <iostream>
#include "StateManager.h"
#include "StateMachine.h"

// 错误处理函数
void errorHandler(int errorCode, std::string errMsg) {
    // std::cout<<"错误"<<std::endl;
    // 可以记录错误日志等、对应的错误逻辑
}

Event* getNextEvent();
bool isRun = true;//用来控制是否结束程序

int main() {
    // 注册状态
    StateManager* manager = StateManager::getInstance();
    //注册功能状态
    manager->registState(new NorthMode());
    manager->registState(new EastMode());
    manager->registState(new SouthMode());
    manager->registState(new WestMode());
    //注册错误状态，初始化也要用错误状态
    ErrorMode* errorMode = new ErrorMode();
    manager->registState(errorMode);
    // 创建状态机
    StateMachine stateMachine;
    // 设置错误处理器
    stateMachine.setErrorHandler(errorHandler);
    //初始化状态机
    bool ok = stateMachine.initStateMachine(manager->getState(NorthMode::ID),errorMode);
    if(!ok){
        std::cout<<"初始化状态机失败"<<std::endl;
        return -1;
    }

    while (isRun){
        //这里采用阻塞的方式执行，捕获用户输入，可以自行更改
        Event* e = getNextEvent();
        if(e != nullptr){
            stateMachine.handleEvent(e);
            delete e;
        }
        // 可以添加退出条件，例如：
        // if (shouldExit()) {
        //     running = false;
        // }
    }

    return 0;
}

Event* getNextEvent()
{
    //这里获取对应的事件，只是简单的演示一下功能
    //我就不做太多的修改了
    char c;
    std::cin>>c;
    switch (c) {
        case 'w':{//前进
            Event* e = new Event(EventType::Forward);
            return e;
        }
        case 'a':{//左移
            Event* e = new Event(EventType::Left);
            return e;
        }
        case 's':{//后退
            Event* e = new Event(EventType::Back);
            return e;
        }
        case 'd':{//右移
            Event* e = new Event(EventType::Right);
            return e;
        }
        case '1':{//左转
            Event* e = new Event(EventType::LeftTurn);
            return e;
        }
        case '3':{//右转
            Event* e = new Event(EventType::RightTurn);
            return e;
        }
        case '2':{//后转
            Event* e = new Event(EventType::BackTurn);
            return e;
        }
        case '0':{// 退出
            isRun = false;
            return nullptr;
        }
        default:
            return nullptr;
    }

    return nullptr;
}
